{% extends 'c-word.html' %} {% block title %}python - web_spider{% endblock title %} {% block point1 %}








为什么是一个轻量级的爬虫?

因为一个复杂的爬虫需要考虑的问题很多。比如有一些网页需要用户登录后才能访问,而有一些网页使用的JavaScript异步加载的内容,对这些网页的抓取会比较复杂。

本课程 -- 针对不需要登录的静态网页抓取。

课程内容

1. 爬虫简介 -- 是什么?实现了什么功能?
2. 一个简单爬虫架构 -- 架构包含了那些模块?如何组装到一起完成整个爬取任务?
    三大模块
        URL管理器 -- 用来管理将要抓取的URL和已经抓取过的URL
        网页下载器(urllib2) -- 给定一个URL,需要将URL下载到本地后才能进行后续的分析; urllib2 - Python 自带的模块,实现对网页的下载
        网页解析器(BeautifulSoup) -- 得到网页的内容后,需要解析才能够提前出我们想要的和感兴趣的内容;BeautifulSoup 是Python的第三方插件,用于解析网页
3. 完整实例 -- 实现的架构的代码,爬取百度百科Python词条相关的1000个页面数据,然后将这些数据写入到一个HTML页面中,打开这个页面我们就可以看到所有爬取好的数据



爬虫调度端 -- 启动、停止、监视爬虫的运行情况

爬虫程序的三个模块
    URL 管理器 -- 对将要爬取的 URL 和 已经爬取过的 URL 进行管理从URL管理器中取出一个待爬取的URL,传送给网页下载器
    网页下载器 -- 负责下载URL指定的网页,储存为一个字符串,传送给解析器
    网页解析器 -- 解析所需数据 或 解析该网页的其他URL,补充到URL管理器

该三个模块为一个循环,只要存在相关联的URL,该循环会一直反复运行
 











网页下载器 -- 将互联网上URL对应的网页下载到本地的工具,因为将网页下载到本地才能进行后续的分析和处理;
类似于网页浏览器,会将URL对应的互联网网页以HTML的形式下载到本地,储存为一个本地文件或字符串,然后进行后续的分析和处理。

urllib2 -- Python 官方基础模块,支持直接的URL下载,或向网页提交一些需要用户输入的数据,甚至支持需要登录网页的cookie处理或需要代理访问的代理处理等功能。

requests -- Python 第三方插件,功能更强大。

本课程使用 urllib2
 





url -- 向服务器提交请求的 url
header -- 向服务器提交http的头信息
data -- 向服务器提交需要用户输入的数据

将url, data, header 三个参数传送给 urllib2.Request 类,生成一个 request 对象;
 使用urllib2 的 urlopen 方法,以request 作为参数,发送网页请求

以 cookie处理 为例


HTTPCookieProcessor -- 处理需要登录才能访问的网页
ProxyHandler -- 处理需要代理才能访问的网页
HTTPSHhandler -- 处理协议为 HTTPS 加密访问的网页
HTTPRedirectHandler -- 处理 url 为自动相互自动跳转的网页

将以上Handler 传递给 urllib2 的 build_opener(handler) 方法,创建一个 opener 对象;
然后使用 install_opener(opener) 方法 给 urllib2 install 这个 opener;这样,urllib2 就具有了以上场景的处理能力;
然后用 urllib2 的 urlopen() 方法来请求一个url 或 一个 request 实现网页的下载

例子解析
引入 urllib2 和 cookielib 模块
创建一个 CookieJar 来储存 cookie 数据,使用 cookielib 的 CookieJar() 方法创建 
使用 urllib2 的.HHTTPCookieProcessor() 以 cj 为参数生成一个handler,将 handler 传递给 urllib2 的 build_opener() 方法 来生成一个 opener 对象
然后使用 install_opener(opener) 方法 给 urllib2 install 这个 opener;
最后用 urllib2 的 urlopen() 方法来请求一个url 或 一个 request 实现网页的下载



# coding: utf8
 
from urllib import request
import http.cookiejar
 
url='http://www.baidu.com'
 
print('first way')
response1 = request.urlopen(url)
print(response1.getcode())
print(len(response1.read()))
 
print('second way')
req=request.Request(url)
req.add_header('user-agent', 'Mozilla/5.0')
response2  = request.urlopen(req)
print(response2.getcode())
print(len(response2.read()))
 
print('third way')
cj = http.cookiejar.CookieJar()
opener = request.build_opener(request.HTTPCookieProcessor(cj))
request.install_opener(opener)
response3  = request.urlopen(url)
print(response3.getcode())
print(cj)
print(response3.read())




几种网页解析器
模糊匹配
1. 正则表达式 -- 字符串形式的模糊匹配,将整个网页视为一段字符串,使用模糊匹配的方式提取所需数据;虽然直观,若文档比较复杂,会非常麻烦;

以下三种为结构化解析 - HTML DOM 树
2. html.parser -- Python 自带模块
3. Beautiful Soup -- Python 第三方插件,拥有2、4功能;相对比较强大
4. lxml -- Python 第三方插件














# coding:utf8
 
from bs4 import BeautifulSoup
import re
 
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
 
<p class="story">...</p>
"""
 
 # 创建一个 bs对象;设置第一个参数为  html_doc;第二个参数为 html.parser 解析器,第三个参数为字符编码
soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')
 
print('获取所有的链接')
links = soup.find_all('a')
for link in links:
    print(link.name,link['href'],link.get_text())
     
print('获取 Lacie的链接')
link_node=soup.find('a',href='http://example.com/lacie')
print(link_node.name,link_node['href'],link_node.get_text())
 
print('正则匹配')
link_node=soup.find('a',href=re.compile(r"ill"))
print(link_node.name,link_node['href'],link_node.get_text())
 
print('获取p段落文字,注意--class需要加下划线')
p_node=soup.find('p',class_="title")
print(p_node.name,p_node.get_text())




注意:很多网站可能为不定期的升级她的格式,作为一个定向爬虫来说,如何目标网站的格式发生了升级,我们的抓取策略也需要随之升级











{% endblock %}